package com.ruyuan.seckilling.activity.listener;

import com.alibaba.fastjson.JSONObject;
import com.ruyuan.seckilling.activity.constant.ActivityStatusVal;
import com.ruyuan.seckilling.activity.entity.Activity;
import com.ruyuan.seckilling.activity.service.ActivityService;
import com.ruyuan.seckilling.activity.service.ActivitySkuRefService;
import com.ruyuan.seckilling.common.QueueKey;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author zhonghuashishan
 */
@Slf4j
@Component
@RocketMQMessageListener(topic = QueueKey.QUEUE_RENDER_PAGE_RESULT, consumerGroup = "pageResultGroup")
public class PageResultListener implements RocketMQListener<String> {

    @Autowired
    private ActivityService activityService;

    @Autowired
    private ActivitySkuRefService activitySkuRefService;

    @Override
    public void onMessage(String messageString) {

        log.info("收到渲染页面的结果, message={}", messageString);

        JSONObject message = JSONObject.parseObject(messageString);

        if (!message.getBoolean("success")) {
            log.error("页面渲染失败，需要及时查看问题");
            return;
        }

        // 获取自己指定的bizData
        // 渲染秒杀活动页面时指定的bizData是这样的
        // .bizData(ImmutableMap.of("type", "activity", "activityId", activity.getId()))
        // 渲染秒杀商品页面时指定的bizData是这样的
        // .bizData(ImmutableMap.of("type", "product", "activityId", activity.getId(), "skuId", activitySkuRef.getSkuId()))

        JSONObject bizData = message.getJSONObject("bizData");
        String type = bizData.getString("type");
        Long activityId = bizData.getLong("activityId");

        if (StringUtils.equals(type, "activity")) {
            activityService.updataPageReady(activityId, true);
            log.info("收到渲染页面的结果, 是活动页面的结果, 把活动的pageReady字段修改为true");
        } else if (StringUtils.equals(type, "product")) {
            activitySkuRefService.updataPageReady(activityId, bizData.getLong("skuId"), true);
            log.info("收到渲染页面的结果, 是商品页面的结果, 把商品的pageReady字段修改为true");
        }

        // 判断当前活动是否所有的静态页面都渲染好了
        Activity activity = activityService.queryById(activityId);
        Integer count = activitySkuRefService.countByActivityIdAndPageReady(activityId, false);
        if (activity.getPageReady() && count == 0) {
            // 秒杀活动的页面渲染成功了，秒杀活动的所有商品页面也都渲染成功了，更新活动的状态为'已经渲染好页面'，下一步可以同步库存了
            activityService.updataStatus(activityId, ActivityStatusVal.PAGE_RENDERING.getCode(),
                    ActivityStatusVal.PAGE_RENDERED.getCode());
            log.info("收到渲染页面的结果, 检查后发现当前活动的活动页面和商品页面都渲染好了，把活动状态改为'页面已渲染'");
        }
    }
}
